package vericopServer;

import java.security.Security;

import messages.SignatureCheckRequestMessage;
import messages.SignatureCheckResponseMessage;
import messages.SignatureRegisterRequestMessage;
import messages.SignatureRegisterResponseMessage;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import connection.exception.ConnectionResetException;

public class VericopServer {
	
	private VericopData _vericopData;

	static{
		Security.addProvider(new BouncyCastleProvider());
	};
	
	public VericopServer() throws ConnectionResetException{
		_vericopData = new VericopData("Jq8C531GCt");
	}
	
	public void run() throws ConnectionResetException{

        while(true){
            Object msg = _vericopData.receive();

            if(msg == null)
                continue;
            
            // Mensagem de Adição de uma Assinatura por VERICOP
            if(msg.getClass().getName().equals("messages.SignatureRegisterRequestMessage")) {

                // Fazer Cast à mensagem
                SignatureRegisterRequestMessage req = (SignatureRegisterRequestMessage) msg;                    
                
                // Verificação da Assinatura VERICOP 
                Integer serial = req._signatureSerial;
                String sigReceived = req._signatureSignedValue;
                Boolean result = _vericopData.storeSignature(serial, sigReceived);
                
                // Enviar Resposta
                Integer sessionID = req._sessionID;
                SignatureRegisterResponseMessage res = new SignatureRegisterResponseMessage(serial, result, sessionID);
                _vericopData.send(res);
            } // Mensagem de Verificação de uma assinatura local
            else if(msg.getClass().getName().equals("messages.SignatureCheckRequestMessage")) {

                // Fazer Cast à mensagem
                SignatureCheckRequestMessage req = (SignatureCheckRequestMessage) msg;                    
                
                // Verificação da Assinatura VERICOP 
                Integer serial = req._signatureSerial;
                String sigReceived = req._signatureSignedValue;
                Boolean result = _vericopData.checkSignature(serial, sigReceived);
                
                // Enviar Resposta
                Integer sessionID = req._sessionID;
                SignatureCheckResponseMessage res = new SignatureCheckResponseMessage(serial, result, sessionID);
                _vericopData.send(res);

            } else {
                throw new RuntimeException("Received an Unsupported Message Type: " + msg.getClass().getName());
            }
        }
	}
	
	public static void main(String[] args){
		VericopServer vericop;
		try {
			vericop = new VericopServer();
			vericop.run();
		} catch (ConnectionResetException e) {
			e.printStackTrace();
		}
		
	}
}
